<?php

/**
 * Description of XDS_RecordProvider
 *
 * @author prometheus
 */
class XDS_RecordProvider extends x10_Provider
{
	/**
	 * A rekord "piszkos", ha nem tartozik az eredeti adatsorhoz (új).
	 * @var Bool
	 */
	public $dirty = FALSE;

	/**
	 * A rekord "változott", ha tartalmát frissítették az eredetihez képest.
	 * @var Bool
	 */
	public $changed = FALSE;

	/**
	 * A rekord "törölt", ha az adatsor mentése után nem lesz része az adatsornak.
	 * @var Bool
	 */
	public $removed = FALSE;
	
	/**
	 * @var XDS_Record
	 */
	protected $record;

	/**
	 * @var XDS_Record
	 */
	protected $originalRecord;

	/**
	 * @var XDS_RecordSet
	 */
	protected $rs;

	/**
	 * A rekord sorszáma a halmazban.
	 * @var Int
	 */
	protected $idx = NULL;

	/**
	 * Konstruktor.
	 * @param x10_Config $config
	 */
	public function __construct(x10_Config $config)
	{
		parent::__construct($config);
	}

	/**
	 * Beállítja a rekordot birtokló rekordhalmaz-objektumot.
	 * @param XDS_RecordSet $rs
	 */
	public function setRecordSet(XDS_RecordSet $rs)
	{
		$this->rs = $rs;
	}

	public function setRecordIdx($idx)
	{
		$this->idx = $idx;
	}

	/**
	 * Beállítja a rekord mezőihez tartozó értékeket a kapott asszociatív tömb
	 * vagy objektum alapján.
	 * @param Array|Object $data
	 */
	public function set($data)
	{
		unset($this->record);
		$this->record = new XDS_Record($data);
		$this->afterSet();
	}

	/**
	 * Az {@link set értékbeállítás} után kerül meghívásra, felülírásával
	 * lehetőség adódik programozottan számolt értékek megadására.
	 */
	protected function afterSet() {}

	/**
	 * Meghívása tájékoztatja az objektumot, hogy éppen hozzáfűzésre került
	 * egy adatsorhoz.
	 */
	public function appending()
	{
		if (!$this->rs->isOpened())
		{
			$this->dirty = TRUE;
			if (!is_null($this->rs)) $this->rs->registerChange('added', $this->idx);
		}
	}

	/**
	 * Meghívása tájékoztatja az objektumot, hogy értéke megváltozik. Az új
	 * értéket jelentő adatsor kiszolgálót paraméterként kell átadni.
	 * @param XDS_RecordProvider $to
	 */
	public function changing(XDS_RecordProvider $to)
	{
		if (is_null($this->originalRecord))
		{
			$this->originalRecord = clone($this->record);
		}
		$this->record = $to->get();
		$this->changed = TRUE;
		$this->rs->registerChange('modified', $this->idx);
	}

	/**
	 * Meghívása jelzi az objektumnak, hogy a következő mentés után nem lesz
	 * része az adatsoroknak, törlésre kerül.
	 */
	public function removing()
	{
		$this->removed = TRUE;
		$this->rs->registerChange('removed', $this->idx);
	}

	public function getPKValues()
	{
		$result = array();
		foreach ($this->rs->getRecordDescriptor()->PK as $field)
		{
			$keyName = $field->name;
			$result[$keyName] = $this->record->$keyName;
		}
		return $result;
	}

	/**
	 * Visszatér a szolgáltató által kezelt adatokkal.
	 * @return XDS_Record
	 */
	public function get()
	{
		return $this->record;
	}
}

?>